package com.greateffect.littlebud.lib.utils;

import android.os.Build;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

/**
 * @Description
 * @Author zengcs@vip.qq.com
 * @Date 2018/4/8
 * @Version V1.0.0
 */
public class WebViewConfigUtil {

    public static void config(WebView webView) {
        WebSettings webSettings = webView.getSettings();
        // 设置编码格式
        webSettings.setDefaultTextEncodingName("UTF-8");
        // 支持JS
        webSettings.setJavaScriptEnabled(true);
        // 支持通过JS打开新窗口
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

        /**
         * Viewport相关，以下两者合用，设置自适应屏幕
         */
        // 调整图片到适合WebView的大小
        webSettings.setUseWideViewPort(true);
        // 缩放至屏幕大小，true-可以通过meta来设置Viewport，user-scalable=no可禁用缩放功能
        webSettings.setLoadWithOverviewMode(true);
        // 设置自适应
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        // android 5.0以上默认不支持Mixed Content
        if (Build.VERSION.SDK_INT > 20) {
            webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }

        /**
         * 设置缩放控制
         */
        // 支持缩放
        webSettings.setSupportZoom(true);
        // 设置内置的缩放控件
        webSettings.setBuiltInZoomControls(true);
        // 隐藏原生的缩放控件
        webSettings.setDisplayZoomControls(false);

        /**
         * 加载图片策略相关
         */
        // 设置是否自动加载图片，默认是true，如果设置为false，那么所有图片都不会被加载，包括本地图片
        webSettings.setLoadsImagesAutomatically(true);
        // 设置是否阻止加载网络图片，默认是false，如果设置为true，那么网络图片将不会加载
        // (可以先设置为true，然后再设置为false，来加快页面加载速度)
        webSettings.setBlockNetworkImage(false);
        // 设置是否阻止加载网络资源(不仅仅是图片)，默认是false，如果设置为true，那么网络上的js，css，图片等资源都不会加载
        webSettings.setBlockNetworkLoads(false);

        /**
         * H5属性相关
         */
        // 支持H5的application cache的功能
        webSettings.setAppCacheEnabled(true);
        // 设置application cache的存储路径(通常存储js，css，图片等)
        // webSettings.setAppCachePath("xxx");
        // 支持H5的session storage和local storage
        webSettings.setDomStorageEnabled(true);
        // 支持javascript读，写db
        webSettings.setDatabaseEnabled(true);
        // 设置js创建的db文件的路径，Api 19以后废弃，直接由WebView管理
        webSettings.setDatabasePath("xxx");

        /**
         * 设置加载资源时，如何使用cache，默认设置是:WebSettings.LOAD_DEFAULT，当WebView正常加载一个页面时，
         * 如果缓存命中且没有过期，则使用缓存数据，否则从网络加载，当WebView.goBack()时，如果缓存命中，直接使用，
         * 不会验证是否过期，可用的其他设置:LOAD_CACHE_ELSE_NETWORK， LOAD_NO_CACHE， LOAD_CACHE_ONLY
         */
        webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);

        /**
         * 设置渲染线程的优先级
         */
        // 该方法在 Api 18之后被废弃，优先级由WebView自己管理，不过任然建议将其设置为 HIGH，来提高页面渲染速度
        webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);

        /**
         * 其他参数配置
         */
        // 支持插件
        webSettings.setPluginState(WebSettings.PluginState.ON);
        // 支持多窗口
        webSettings.setSupportMultipleWindows(true);
        // 设置可以访问文件
        webSettings.setAllowFileAccess(true);
    }

    public static void registerWebViewClient(WebView webView){
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }

            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }
        });
    }

    public static void release(WebView wv) {
        // 防止webView导致内存泄漏
        if (wv != null) {
            ViewParent parent = wv.getParent();
            if (parent != null) {
                ((ViewGroup) parent).removeView(wv);
            }
            wv.onPause();
            wv.stopLoading(); // 退出时调用此方法，移除绑定的服务，否则某些特定系统会报错
            wv.getSettings().setJavaScriptEnabled(false);
            wv.clearHistory();
            wv.clearView();
            wv.removeAllViews();
            wv.setWebViewClient(null);
            wv.destroy();
            wv = null;
        }
    }

}
